#define DECLARE_TQUEUE(_name, _fn, _arg) \
struct tq_struct _name = { LIST_HEAD_INIT((_name).list), 0, _fn, _arg }
-
#define DECLARE_WORK(_name, _fn, _arg) DECLARE_TQUEUE(_name, _fn, _arg)
+
+#define work_struct tq_struct
+#define INIT_WORK(_work, _fn, _arg) INIT_TQUEUE(_work, _fn, _arg)
+
#define schedule_work(_w) schedule_task(_w)
#endif /* __QUEUES_H__ */
struct list_head blkdev_list;
spinlock_t blk_ring_lock;
atomic_t refcnt;
+
+ struct work_struct work;
} blkif_t;
void blkif_create(blkif_be_create_t *create);
void blkif_destroy(blkif_be_destroy_t *destroy);
void blkif_connect(blkif_be_connect_t *connect);
int blkif_disconnect(blkif_be_disconnect_t *disconnect, u8 rsp_id);
-void __blkif_disconnect_complete(blkif_t *blkif);
+void blkif_disconnect_complete(blkif_t *blkif);
blkif_t *blkif_find_by_handle(domid_t domid, unsigned int handle);
#define blkif_get(_b) (atomic_inc(&(_b)->refcnt))
#define blkif_put(_b) \
do { \
if ( atomic_dec_and_test(&(_b)->refcnt) ) \
- __blkif_disconnect_complete(_b); \
+ blkif_disconnect_complete(_b); \
} while (0)
/* An entry in a list of xen_extents. */
return blkif;
}
-void __blkif_disconnect_complete(blkif_t *blkif)
+static void __blkif_disconnect_complete(void *arg)
{
+ blkif_t *blkif = (blkif_t *)arg;
ctrl_msg_t cmsg;
blkif_be_disconnect_t disc;
/*
- * These can't be done in __blkif_disconnect() because at that point there
+ * These can't be done in blkif_disconnect() because at that point there
* may be outstanding requests at the disc whose asynchronous responses
* must still be notified to the remote driver.
*/
ctrl_if_send_response(&cmsg);
}
+void blkif_disconnect_complete(blkif_t *blkif)
+{
+ INIT_WORK(&blkif->work, __blkif_disconnect_complete, (void *)blkif);
+ schedule_work(&blkif->work);
+}
+
void blkif_create(blkif_be_create_t *create)
{
domid_t domid = create->domid;
spinlock_t rx_lock, tx_lock;
struct net_device *dev;
struct net_device_stats stats;
+
+ struct work_struct work;
} netif_t;
void netif_create(netif_be_create_t *create);
void netif_destroy(netif_be_destroy_t *destroy);
void netif_connect(netif_be_connect_t *connect);
int netif_disconnect(netif_be_disconnect_t *disconnect, u8 rsp_id);
-void __netif_disconnect_complete(netif_t *netif);
+void netif_disconnect_complete(netif_t *netif);
netif_t *netif_find_by_handle(domid_t domid, unsigned int handle);
#define netif_get(_b) (atomic_inc(&(_b)->refcnt))
#define netif_put(_b) \
do { \
if ( atomic_dec_and_test(&(_b)->refcnt) ) \
- __netif_disconnect_complete(_b); \
+ netif_disconnect_complete(_b); \
} while (0)
void netif_interface_init(void);
return netif;
}
-void __netif_disconnect_complete(netif_t *netif)
+static void __netif_disconnect_complete(void *arg)
{
+ netif_t *netif = (netif_t *)arg;
ctrl_msg_t cmsg;
netif_be_disconnect_t disc;
/*
- * These can't be done in __netif_disconnect() because at that point there
+ * These can't be done in netif_disconnect() because at that point there
* may be outstanding requests at the disc whose asynchronous responses
* must still be notified to the remote driver.
*/
ctrl_if_send_response(&cmsg);
}
+void netif_disconnect_complete(netif_t *netif)
+{
+ INIT_WORK(&netif->work, __netif_disconnect_complete, (void *)netif);
+ schedule_work(&netif->work);
+}
+
void netif_create(netif_be_create_t *create)
{
int err = 0;